// http://poj.org/problem?id=2955
// https://www.acwing.com/problem/content/description/4922/

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

int main() {
    string s;
    while (cin >> s) {
        if (s == "end") break;
        int n = s.length();
        int dp[n][n];
        // 初始化 DP 数组，特别是长度为 1 的区间
        memset(dp, 0, sizeof(dp));

        // L 是当前考虑的区间长度
        for (int L = 2; L <= n; L++) {
            // i 是区间的起始下标
            for (int i = 0; i + L - 1 < n; i++) {
                // j 是区间的结束下标
                int j = i + L - 1;

                // 情况二：枚举所有分割点，尝试合并
                for (int k = i; k < j; k++) {
                    dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j]);
                }

                // 情况一：如果首尾括号匹配
                if ((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']')) {
                    // 注意：当区间长度为2且匹配时，dp[i+1][j-1]是0，所以结果是0+2=2，这是正确的。
                    dp[i][j] = max(dp[i][j], dp[i+1][j-1] + 2);
                }
            }
        }
        cout << dp[0][n-1] << endl;
    }
    return 0;
}